package edu.erpan.web.pedidos;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import edu.erpan.bl.entities.Cliente;
import edu.erpan.bl.entities.administracion.TipoIdentificacion;
import edu.erpan.fachada.IOrdenPedidoFachada;
import edu.erpan.fachada.OrdenPedidoFachada;
import edu.erpan.fachada.administracion.IUsuarioFachada;
import edu.erpan.fachada.administracion.UsuarioFachada;
import edu.erpan.util.entityManager.exceptions.PersistException;
import edu.erpan.util.entityManager.exceptions.QueryException;
import edu.erpan.web.util.Recursos;

/**
 * @author JeisonL
 *
 */
public class ClienteBean {

	private Cliente cliente;
	private List<Cliente>clientes;
	private List<SelectItem>itemsTipoDocumentos;
	
	private boolean editandoCliente;
	
	public ClienteBean() {
		this.cliente=new Cliente();
		this.cliente.setTipoIdentificacion(new TipoIdentificacion());
		this.cargarTipoDocumentos();
		this.consultarClientes();
	}

	private void cargarTipoDocumentos() {
		this.itemsTipoDocumentos=new ArrayList<SelectItem>(0);
		List<TipoIdentificacion>listaTiposIdentificacion=consultarTipoIdentificaciones();
		SelectItem item=null;
		for (TipoIdentificacion tipoIdentificacion : listaTiposIdentificacion) {
			item=new SelectItem(tipoIdentificacion.getIdtipoIdentificacion(), tipoIdentificacion.getNombre());
			this.itemsTipoDocumentos.add(item);
		}
	}
	private List<TipoIdentificacion> consultarTipoIdentificaciones() {
		IUsuarioFachada usuarioFachada = new UsuarioFachada();
		try {
			return usuarioFachada.consultarTiposIdentificacion();
		} catch (QueryException e) {
			String nombreEntidad=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_TIPOS_ID);
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_CONSULTA);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje.replace("{0}", nombreEntidad));
		}catch (Exception e) {
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_INESPERADO);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
		}
		return new ArrayList<TipoIdentificacion>(0);
	}

	private void consultarClientes() {
		IOrdenPedidoFachada ordenPedidoFachada=new OrdenPedidoFachada();
		try {
			this.clientes=ordenPedidoFachada.consultarClientes();
			
		} catch (QueryException e) {
			String nombreEntidad=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_CLIENTES);
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_CONSULTA);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje.replace("{0}", nombreEntidad));
		}catch (Exception e) {
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_INESPERADO);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
		}
	}
	
	public void guardarCliente(ActionEvent evento){
		IOrdenPedidoFachada ordenPedidoFachada=new OrdenPedidoFachada();
		try {
			if(validacionCamposCliente(this.cliente,true)){
				this.cliente=ordenPedidoFachada.guardarCliente(this.cliente);
			}
			this.consultarClientes();
		}catch (PersistException e) {
			String nombreEntidad=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_CLIENTE);
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_GUARDADO);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje.replace("{0}", nombreEntidad));
		}catch(Exception e){
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_INESPERADO);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
		}
	}
	
	private boolean validacionCamposCliente(Cliente cliente,boolean validarExistenciaCliente) throws QueryException {
		boolean cumple=true;
		String mensaje = Recursos.getInstance().getMensaje("campo.obligatorio");
		String nombreCampo="";
		
		mensaje = Recursos.getInstance().getMensaje("campo.obligatorio");
		
		if(cliente.getNombre()==null||cliente.getNombre().trim().isEmpty()){
			cumple=false;
			nombreCampo=Recursos.getInstance().getEtiqueta("cliente.nombre");
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje("idMensajes"),Recursos.ERROR, mensaje.replace("{0}", nombreCampo));
		}else{
			cliente.setNombre(cliente.getNombre().trim());
		}
		
		if(cliente.getTipoIdentificacion()==null||cliente.getTipoIdentificacion().getIdtipoIdentificacion()<=0){
			cumple=false;
			nombreCampo=Recursos.getInstance().getEtiqueta("cliente.tipoIdentificacion");
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje("idMensajes"),Recursos.ERROR, mensaje.replace("{0}", nombreCampo));
		}
		
		if(cliente.getNumeroIdentificacion()==null||cliente.getNumeroIdentificacion().trim().isEmpty()){
			cumple=false;
			nombreCampo=Recursos.getInstance().getEtiqueta("cliente.numeroIdentificacion");
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje("idMensajes"),Recursos.ERROR, mensaje.replace("{0}", nombreCampo));
		}else{
			cliente.setNumeroIdentificacion(cliente.getNumeroIdentificacion().trim());
		}
		
		if(cliente.getCorreoElectronico()==null||cliente.getCorreoElectronico().trim().isEmpty()){
			cumple=false;
			nombreCampo=Recursos.getInstance().getEtiqueta("cliente.correoElectronico");
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje("idMensajes"),Recursos.ERROR, mensaje.replace("{0}", nombreCampo));
		}else{
			String PATTERN_EMAIL = 
					"^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
							+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
			Pattern pattern=Pattern.compile(PATTERN_EMAIL);
			Matcher matcher = pattern.matcher(cliente.getCorreoElectronico().trim());
	        
			if(matcher.matches()){
				cliente.setCorreoElectronico(cliente.getCorreoElectronico().trim());
			}else{
				cumple=false;
				mensaje=Recursos.getInstance().getMensaje("error.cliente.correoElectronicoInvalido");
				Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje("idMensajes"),Recursos.ERROR, mensaje);
			}
		}
		
		if(validarExistenciaCliente){
			Cliente personaVerificar=consultarClientePorIdentificacion(cliente);
			if(personaVerificar!=null){
				cumple=false;
				mensaje = Recursos.getInstance().getMensaje("error.clientes.existe");
				List<TipoIdentificacion>tiposId=this.consultarTipoIdentificaciones();
				TipoIdentificacion tipoId=null;
				for(TipoIdentificacion identificacion:tiposId){
					if(identificacion.getIdtipoIdentificacion()==cliente.getTipoIdentificacion().getIdtipoIdentificacion()){
						tipoId=identificacion;
						break;
					}
				}
				mensaje=mensaje.replace("{0}", tipoId.getAcronimo()+" "+cliente.getNumeroIdentificacion());
				Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje("idMensajes"),Recursos.ERROR, mensaje);
			}
		}
		return cumple;
	}

	private Cliente consultarClientePorIdentificacion(Cliente cliente) throws QueryException{
		IOrdenPedidoFachada ordenPedidoFachada=new OrdenPedidoFachada();
		return ordenPedidoFachada.consultarClientesPorIdentificacion(cliente);
	}

	public void editarCliente(ActionEvent evento){
		IOrdenPedidoFachada ordenPedidoFachada=new OrdenPedidoFachada();
		try {
			if(validacionCamposCliente(this.cliente,true)){
				this.cliente=ordenPedidoFachada.guardarCliente(this.cliente);
			}
		}catch (PersistException e) {
			String nombreEntidad=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_CLIENTE);
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_GUARDADO);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje.replace("{0}", nombreEntidad));
		}catch(Exception e){
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_INESPERADO);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
		}
	}

	public void cancelarEdicionCliente(ActionEvent evento){
		this.cliente=new Cliente();
		this.cliente.setTipoIdentificacion(new TipoIdentificacion());
		this.editandoCliente=false;
	}
	
	public void consultarClientes(ActionEvent evento){
		this.consultarClientes();
	}
	
	public void seleccionarClienteEditar(ActionEvent evento){
		Integer idCliente=(Integer) evento.getComponent().getAttributes().get("idCliente");
		IOrdenPedidoFachada ordenPedidoFachada=new OrdenPedidoFachada();
		
		try {
			
			Cliente cliente=new Cliente();
			cliente.setIdcliente(idCliente);
			
			this.cliente=ordenPedidoFachada.consultarCliente(cliente);
			this.editandoCliente=true;
		} catch (QueryException e) {
			String nombreEntidad=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_CLIENTE);
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_SELECCION);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje.replace("{0}", nombreEntidad));
		} catch (Exception e) {
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_INESPERADO);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
		}
	}
	
	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public List<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}

	public List<SelectItem> getItemsTipoDocumentos() {
		return itemsTipoDocumentos;
	}

	public void setItemsTipoDocumentos(List<SelectItem> itemsTipoDocumentos) {
		this.itemsTipoDocumentos = itemsTipoDocumentos;
	}

	public boolean isEditandoCliente() {
		return editandoCliente;
	}

	public void setEditandoCliente(boolean editandoCliente) {
		this.editandoCliente = editandoCliente;
	}

}
